package servidor;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.Vector;

import comum.CartaComum;


public final class RN_Baralho {	
    private static final int NUMERO_DE_CARTAS = 13;
    private static final RN_Baralho INSTANCE = new RN_Baralho();

    private Vector<CartaComum> cartas;

    private RN_Baralho() {
        if(INSTANCE != null) {
            throw new IllegalStateException("Already Instantiated");
        }
        cartas = new Vector<CartaComum>();
        for (int i=0; i<NUMERO_DE_CARTAS; i++){
            cartas.add(new CartaComum(CartaComum.OUROS,i+1)); //TODO corrigir geracao de cartas
            cartas.add(new CartaComum(CartaComum.ESPADAS,i+1));
            cartas.add(new CartaComum(CartaComum.COPAS,i+1));
            cartas.add(new CartaComum(CartaComum.PAUS,i+1));
        }
    }

    public static RN_Baralho getRN_Baralho() {
        return INSTANCE;
    }

    public void embaralharCartas() {		
        Collections.shuffle(cartas);
    }

    public void distribuirCartas(Vector<RN_JogadorConectado> jogadoresConectados) {

        int numJogadores = jogadoresConectados.size();
        int numDeCartas = cartas.size() / RN_Partida.NUM_JOGADORES; //numJogadores;
        int offsetVetorCartas = 0;

        for (RN_JogadorConectado jogadorConectado : jogadoresConectados) {
            LinkedHashSet<CartaComum> mao = new LinkedHashSet<CartaComum>();
            for (int contadorDeCartas =0; contadorDeCartas < numDeCartas; 
                    contadorDeCartas++) {
                    mao.add(cartas.get(offsetVetorCartas + contadorDeCartas));
            }
            offsetVetorCartas += numDeCartas;
                        
            jogadorConectado.registrarMaoDeCartas(mao);
        }	
    }

	public void resetarBaralho() {
        cartas = new Vector<CartaComum>();
        for (int i=0; i<NUMERO_DE_CARTAS; i++){
            cartas.add(new CartaComum(CartaComum.OUROS,i+1)); //TODO corrigir geracao de cartas
            cartas.add(new CartaComum(CartaComum.ESPADAS,i+1));
            cartas.add(new CartaComum(CartaComum.COPAS,i+1));
            cartas.add(new CartaComum(CartaComum.PAUS,i+1));
        }
	}
}
